package de.bht.netviz.useradm.service;

import de.bht.netviz.dao.exceptions.NonexistentEntityException;
import de.bht.netviz.useradm.config.UseradmConfig;
import de.bht.netviz.useradm.model.RegisteredUser;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Klasse zur Verwaltung von Benutzern mit den üblichen Funktionen.
 * 
 * @author Marius Hentschel
 * @since  2012/11/05
 */
public class UserAdministration {
//   /**
//    * Singleton Instance
//    */
//   private static UserAdministration instance;
//   
//   /**
//    * Standardkonstruktor
//    */
//   private UserAdministration() {
//      
//   }
//   
//   /**
//    * Singleton Getter
//    * @return 
//    *    the Singleton Instance.
//    */
//   public static UserAdministration getInstance() {
//      if( instance == null ) {
//         instance = new UserAdministration();
//      }
//      return instance;
//   }
   
   /**
    * Registriert einen neuen Benutzer mit den angegebenen Daten und speichert ihn
    * in der Datenbank.
    * 
    * @param username
    *    der Benutzername
    * @param firstname
    *    der Vorname des Benutzers
    * @param lastname
    *    der Nachname des Benutzers
    * @param email
    *    die E-Mail Adresse des Benutzers
    * @param passwordClear
    *    das Passwort des Benutzers im Klartext
    * @return 
    *    Bei Erfolg wird das neu angelegte RegisteredUser-Objekt zurück gegeben,
    *    ansonsten NULL.
    */
   public static RegisteredUser registerUser( String username, String firstname
                                            , String lastname, String email
                                            , String passwordClear ) {
      RegisteredUser u = new RegisteredUser();
      try {
         // set parameters
         u.setFirstname( firstname ) ;
         u.setLastname( lastname );
         u.setUsername( username);
         u.setEmail( email );
         u.setPassHash( (MessageDigest.getInstance("MD5").digest(passwordClear.getBytes())).toString());
         u.setLastChange( Calendar.getInstance().getTime() );
         
         // persist and check, if okay, return newly registered User
         UseradmConfig.getInstance().getDao().create(u);
         if( !u.equals( UseradmConfig.getInstance().getDao().findByUsername(u.getUsername()))) {
            u = null;
         }
      } catch (NoSuchAlgorithmException ex) {
         Logger.getLogger(UserAdministration.class.getName()).log(Level.SEVERE, null, ex);
         return null;
      }
      return u;
   }
   
   /**
    * Meldet einen registrierten Benutzer an, indem das Passwort geprüft wird.
    * Wurde das korrekte Passwort übergeben, wird das lastLogin Datum auf den 
    * aktuellen Zeitstempel gesetzt.
    * 
    * @param username
    *    der username des anzumeldenden Benutzers
    * @param passwordClear
    *    das Passwort des Benutzers im Klartext
    * @return 
    *    bei erfolgreicher Anmeldung wird das zugehörige RegisteredUser-Objekt 
    *    zurück gegeben, ansonsten NULL.
    */
   public static RegisteredUser login( String username, String passwordClear ) {
      System.out.println("...");
      
      RegisteredUser retVal = null;
      try {
         String passwordHash = (MessageDigest.getInstance("MD5").digest(passwordClear.getBytes())).toString();
         retVal = UseradmConfig.getInstance().getDao().verifyPassword(username, passwordHash);
         if( retVal != null ) {
            retVal.setLastLogin(Calendar.getInstance().getTime());
            UseradmConfig.getInstance().getDao().edit(retVal);
         }
      } catch (NonexistentEntityException | NoSuchAlgorithmException ex) {
         Logger.getLogger(UserAdministration.class.getName()).log(Level.SEVERE, null, ex);
      }
      
      
      return retVal;
   }
}
